require('es6-promise').polyfill();

import Vue from 'vue'
import Q from 'q'

import axios from 'axios'
import FastClick from './lib/fastclick'
import envFuncs from '@/config/base'
let env = envFuncs.getParams()
import { sync } from 'vuex-router-sync'
import store from './store'
import router from './router'
import data from './dev/data'


import bbPlugin from './lib/vue-bb-plugin'
import ddPlugin from './lib/vue-dd-plugin'
import App from './App'
import filters from './filters'

import {getRequestId, S} from './lib/backend'

// import { LoadingPlugin } from 'vux/'
import LoadingPlugin from 'vux/src/plugins/loading'

import VueScroller from 'vue-scroller'
import 'mint-ui/lib/infinite-scroll/style.css'
import {InfiniteScroll} from 'mint-ui'

// import vuei18n from 'vue-i18n'
// Vue.use(vuei18n)

Vue.use(LoadingPlugin)
Vue.use(InfiniteScroll)

Vue.use(VueScroller)
Vue.use(LoadingPlugin)

console.debug('==========================================================debugstart==========================================================')


// console.log(FastClick)
// 实例化过滤器

Object.keys(filters).forEach(k => Vue.filter(k, filters[k]));

window.getParamByName = function(name) {
  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  var r = window.location.search.substr(1).match(reg);
  if (r != null) return unescape(r[2]); return null;
};

window.getNoneHashUrl = function(url) {
  return url.split('#')[0];
}

Vue.config.debug = process.env.NODE_ENV !== 'production';
Vue.config.devtools = process.env.NODE_ENV !== 'production';

let dd = window.dd;
const commit = store.commit || store.dispatch;

let ddConfig = null;

getConfig()
  .then((data)=>{
    ddConfig = data;
    // dd.config(ddConfig);
  })
  .catch((err)=>{
    console.log('getConfig', err);
  })
  .finally(()=>{
    //开发环境
    ddIsReady()
      .then(initVue)
      .then(getRequestAuthCode)
      .then(login)
      .then(()=>{

        if(ddConfig != null){
          commit('DDCONFIG_SUCCESS', ddConfig)
        }else{
          commit('DDCONFIG_ERROR', false);
        }

        startApp()

      })
  })


function getConfig() {

  return Q.Promise((success, error)=>{

    return success({})

    let url = getNoneHashUrl(document.URL);

    // axios.get(env.API_HOST+'/getConfig.php', {params: {paramUrl: url},timeout: 2000,}).then(function (response) {
    // if(response.status == 200 && response.data.code == 200){
    //   let res = response.data.result;
    axios.get(env.CRM_API_HOST+'/dd_config?url=' + url).then(function (response) {
      if(response.status == 200 && response.data.errcode == 0){
        let res = response.data.results;

        let ddConfig = {
          agentId: res.agentId, // 必填，微应用ID
          corpId: res.corpId,//必填，企业ID
          timeStamp: res.timeStamp, // 必填，生成签名的时间戳
          nonceStr: res.nonceStr, // 必填，生成签名的随机串
          signature: res.signature, // 必填，签名
          type:0,   //选填。0表示微应用的jsapi,1表示服务窗的jsapi。不填默认为0。该参数从dingtalk.js的0.8.3版本开始支持
          jsApiList : [
            'runtime.info',
            'runtime.permission.requestAuthCode',
            'runtime.permission.requestOperateAuthCode', //反馈式操作临时授权码

            'biz.alipay.pay',
            'biz.contact.choose',
            'biz.contact.complexChoose',
            'biz.contact.complexPicker',
            'biz.contact.createGroup',
            'biz.customContact.choose',
            'biz.customContact.multipleChoose',
            'biz.ding.post',
            'biz.map.locate',
            'biz.map.view',
            'biz.util.openLink',
            'biz.util.open',
            'biz.util.share',
            'biz.util.ut',
            'biz.util.uploadImage',
            'biz.util.previewImage',
            'biz.util.datepicker',
            'biz.util.timepicker',
            'biz.util.datetimepicker',
            'biz.util.chosen',
            'biz.util.encrypt',
            'biz.util.decrypt',
            'biz.chat.pickConversation',
            'biz.telephone.call',
            // 'biz.navigation.setLeft',
            'biz.navigation.setTitle',
            'biz.navigation.setIcon',
            'biz.navigation.close',
            'biz.navigation.setRight',
            // 'biz.navigation.setMenu',
            'biz.user.get',

            'ui.progressBar.setColors',

            'device.base.getInterface',
            'device.connection.getNetworkType',
            'device.launcher.checkInstalledApps',
            'device.launcher.launchApp',
            'device.notification.confirm',
            'device.notification.alert',
            'device.notification.prompt',
            'device.notification.showPreloader',
            'device.notification.hidePreloader',
            'device.notification.toast',
            'device.notification.actionSheet',
            'device.notification.modal',
            'device.geolocation.get',

            'biz.contact.externalComplexPicker'

          ] // 必填，需要使用的jsapi列表，注意：不要带dd。
        }

        success(ddConfig)
      }else{
        error({errCode:-2,msg:'接口请求失败222'})
      }

    }).catch(function (err) {

      error({errCode:-2,msg:'接口请求失2败'})
    });
  })
}

function startApp() {
  sync(store, router)

  const app = new Vue({
    router,
    store,
    ...App
  })

  Vue.config.productionTip = false

  router.beforeEach((to, from, next) => {
    commit('UPDATE_LOADING', true)
    next()
  })


  router.afterEach((to, from) => {
    const loader = document.getElementById('loader')
    if (loader) loader.remove()
    commit('UPDATE_LOADING', false)
    // next()
  })
  app.$mount('#app-box')

  FastClick.attach(document.body)

  console.log('init vue 完成 FastClick 加载成功 ')
}


function ddIsReady() {
  return Q.Promise((success, error)=>{

    let timeout = setTimeout(()=>{
      error({errCode:-1,msg:'dd.ready初始化超时'});
    },2000)

    success(true)

    // dd.ready(function () {
    //   console.log('初始化钉钉');
    //   clearTimeout(timeout)
    //
    //   //获取容器信息
    //   dd.runtime.info({
    //     onSuccess: function(result) {
    //       window.ability = parseInt(result.ability.replace(/\./g,''));
    //       console.log('容器版本为'+window.ability)
    //
    //       dd.biz.navigation.setTitle({
    //         title: "CRM",//标题
    //         onSuccess : function(result) {
    //           /**/
    //         },
    //         onFail : function() {}
    //       })
    //
    //       //设置返回按钮
    //       dd.biz.navigation.setLeft({
    //         show: true,//控制按钮显示， true 显示， false 隐藏， 默认true
    //         control: true,//是否控制点击事件，true 控制，false 不控制， 默认false
    //         showIcon: true,//是否显示icon，true 显示， false 不显示，默认true； 注：具体UI以客户端为准
    //         text: '返回',//控制显示文本，空字符串表示显示默认文本
    //         onSuccess : function(result) {
    //           //如果control为true，则onSuccess将在发生按钮点击事件被回调
    //           console.log('点击了返回按钮');
    //           window.history.back();
    //         },
    //         onFail : function(err) {}
    //       });
    //
    //     },
    //     onFail : function(err) {}
    //   })
    //
    //   success(true)
    // });
    //
    // dd.error(function(err){
    //   clearTimeout(timeout)
    //   /**
    //    {
    //     message:"错误信息",//message信息会展示出钉钉服务端生成签名使用的参数，请和您生成签名的参数作对比，找出错误的参数
    //     errorCode:"错误码"
    //    }
    //    **/
    //    console.error('dd error: ', err.message, err, ddConfig);
    //
    //   error({errCode:-1,msg:'dd.error配置信息不对'})
    // });
  })
}

//获取请求授权码
function getRequestAuthCode() {

  return Q.Promise((success, error)=>{
    console.log('ssss')
    ddConfig.authCode = '6308453be0af325b96296aea794c9f4b';
    success(true);

    // dd.runtime.permission.requestAuthCode({
    //   corpId: ddConfig.corpId,
    //   onSuccess: function(result) {
    //     ddConfig.authCode = result.code;
    //     success();
    //   },
    //   onFail : function(err) {
    //     console.error(JSON.stringify(err), 'failed', 'ddConfig.corpId:'+ddConfig.corpId)
    //     error({errCode:-1,msg:'dd.error配置信息不对'})
    //   }
    // });

  });
}


function login() {
  return Q.Promise((success, error) => {

    console.log(ddConfig.authCode, 'ddConfig.authCode ')

    let params = S({
      "trace": {
      "requestId": getRequestId()
      },
      "info": {
      "code": ddConfig.authCode
      }
    });

    const siteId = window['getParamByName']('site_id');
    const phone = window['getParamByName']('phone');
    commit('UPDATE_SITE_ID', siteId)

    if (siteId && phone) {
      axios.get(env.CRM_API_HOST + '/site/'+ siteId +'/get_token/' + phone)
        .then((response) => {
          if (response.data.errcode === 0) {
            commit('UPDATE_TOKEN', response.data.results)
            initLoginUser(response.data.results).then(() => {
              success()
            })
          }
        })
    } else {
      initLoginUser(data.token).then(() => {
        commit('UPDATE_TOKEN', data.token)
        success()
      })

    }


    console.debug(params);

    // axios.post(env.CRM_API_HOST+'/ding/login', params).then(function (response) {
    //
    //   if(response.status == 200 && response.data.errcode == 0){
    //     let res = response.data.results;
    //     commit('UPDATE_TOKEN', res.token)
    //     initLoginUser(res.token);
    //     success();
    //   } else {
    //     error({errCode:-2,msg:'接口请求失2败'})
    //   }
    //
    // }).catch(function (err) {
    //   console.error(err);
    //   error({errCode:-2,msg:'接口请求失2败'})
    // });


  });
}

function initLoginUser(token){

  return Q.Promise((success, error)=>{

  axios.get(env.CRM_API_HOST + '/users/' + token).then(function (response) {

    if(response.status == 200 && response.data.errcode == 0){
      let res = response.data.results;
      commit('UPDATE_USER', res)
      success();
    } else {
      error({errCode:-2,msg:'接口请求失2败'})
    }

  }).catch(function (err) {
    console.error(err);
    error({errCode:-2,msg:'接口请求失2败'})
  });

  });
}

function initVue() {

  return Q.Promise((success, error)=>{

    Vue.use(bbPlugin)
    Vue.use(ddPlugin)
    success()

  }).catch(function (err) {
    console.log(err,2)
  });
}
